﻿namespace StockSharp.Algo.Indicators.Misc
{
	using System.ComponentModel;

	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators.Oscillator;
	using StockSharp.Algo.Indicators.Trend;

	using Xceed.Wpf.Toolkit.PropertyGrid.Attributes;

	/// <summary>
	/// Волатильность Чайкина.
	/// </summary>
	/// <remarks>
	/// http://www2.wealth-lab.com/WL5Wiki/Volatility.ashx
	/// http://www.incrediblecharts.com/indicators/chaikin_volatility.php
	/// </remarks>
	[DisplayName("Волатильность")]
	[Description("Волатильность Чайкина.")]
	public class ChaikinVolatility : BaseIndicator<IIndicatorValue>
	{
		/// <summary>
		/// Создать <see cref="ChaikinVolatility"/>.
		/// </summary>
		public ChaikinVolatility()
		{
			Ema = new ExponentialMovingAverage();
			Roc = new RateOfChange();
		}

		/// <summary>
		/// Скользящая средняя.
		/// </summary>
		[ExpandableObject]
		[DisplayName("MA")]
		[Description("Скользящая средняя.")]
		[Category("Основное")]
		public ExponentialMovingAverage Ema { get; private set; }

		/// <summary>
		/// Скорость изменения.
		/// </summary>
		[ExpandableObject]
		[DisplayName("ROC")]
		[Description("Скорость изменения.")]
		[Category("Основное")]
		public RateOfChange Roc { get; private set; }

		/// <summary>
		/// Сформирован ли индикатор.
		/// </summary>
		public override bool IsFormed
		{
			get { return Roc.IsFormed; }
		}

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override IIndicatorValue OnProcess(IIndicatorValue input)
		{
			var candle = input.GetValue<Candle>();
			var result = Roc.Process(Ema.Process(input.SetValue(candle.HighPrice - candle.LowPrice)));
			return result;
		}
	}
}